﻿using System;
using System.Linq;
using System.Web.Mvc;
using myFinance.Models.ViewModels;
using myFinance.Models;
using myFinance.BLL;
using System.Diagnostics;
using System.Text;
using System.Collections.Generic;

namespace myFinance.Controllers
{
    [Authorize]
    public class GrupoDespesaController : Controller
    {
        #region ViewModels
        GrupoDespesaViewModel viewModel = new GrupoDespesaViewModel();
        #endregion

        #region Index
        public ActionResult Index() // Index padrão
        {
            // Se o usuário ainda não tiver um cadastro gravado, retorna pro cadastro
            if (PessoaBll.GetPessoa(User.Identity.Name) == null)
                return RedirectToAction("Cadastro", "Perfil");

            var model = viewModel.Listar(User.Identity.Name, null);
            ViewBag.Grupo = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome");
            return View(model);
        }

        [HttpGet]
        public ActionResult Filtrar(int grupo)
        {
            var model = viewModel.Listar(User.Identity.Name, grupo);
            var lista = ConstroiTabela(model);
            return Json(new { tbody = lista[0], tfoot = lista[1] }, JsonRequestBehavior.AllowGet);
        }
        #endregion

        #region Cadastro
        public ActionResult Cadastro(int id) // Formulário de Cadastro
        {
            // Se o usuário ainda não tiver um cadastro gravado, retorna pro cadastro
            if (PessoaBll.GetPessoa(User.Identity.Name) == null)
                return RedirectToAction("Cadastro", "Perfil");

            var model = new GrupoDespesa();
            if (id > 0)
            {
                model = GrupoDespesaBll.GetGrupoDespesa(id, User.Identity.Name);
            }
            else
            {
                model.PessoaId = PessoaBll.GetId(User.Identity.Name);
            }

            return View(model);
        }

        public ActionResult CadastroGrupo(int id, bool conta)
        {
            var model = new GrupoDespesa();
            if (id > 0)
            {
                model = GrupoDespesaBll.GetGrupoDespesa(id, User.Identity.Name);
            }
            else
            {
                model.PessoaId = PessoaBll.GetId(User.Identity.Name);
            }
            return View(model);
        }

        public ActionResult CadastroSubGrupo(int id, bool conta)
        {
            var model = new SubGrupoDespesa();
            if (id > 0)
            {
                model = SubGrupoDespesaBll.GetSubGrupoDespesa(id, User.Identity.Name);
                ViewBag.Grupo = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome", model.GrupoDespesaId);
            }
            else
            {
                ViewBag.Grupo = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome");
            }
            return View(model);
        }

        public ActionResult CadastroGrupoConta()
        {   
            return View();
        }

        public ActionResult CadastroSubGrupoConta()
        {
            ViewBag.GrupoDespesa = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome");
            return View();
        }
        #endregion

        #region Salvar
        [HttpPost]
        public ActionResult CadastroGrupo(GrupoDespesa modelView)
        {
            if (ModelState.IsValid)
            {
                var usuario = User.Identity.Name;
                try
                {
                    if (modelView.Id > 0)
                    {
                        var model = GrupoDespesaBll.GetGrupoDespesa(modelView.Id, usuario);
                        TryUpdateModel(model);
                        GrupoDespesaBll.Edit(model);
                    }
                    else
                    {
                        var model = new GrupoDespesa();
                        TryUpdateModel(model);
                        GrupoDespesaBll.Add(model);
                    }

                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { gravou = true });
                    }

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
                return View(modelView);
            }
        }

        [HttpPost]
        public ActionResult CadastroGrupoConta(string nomeGrupo)
        {
            if (!string.IsNullOrWhiteSpace(nomeGrupo))
            {
                var usuario = User.Identity.Name;
                try
                {
                    var model = new GrupoDespesa();
                    model.PessoaId = PessoaBll.GetId(User.Identity.Name);
                    model.Nome = nomeGrupo;
                    
                    GrupoDespesaBll.Add(model);
                    
                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { gravou = true, idGrupo = model.Id });
                    }

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    return Json(new { gravou = false, msgEx = ex.Message });
                }
            }
            else
            {
                return View();
            }
        }

        [HttpPost]
        public ActionResult CadastroSubGrupo(SubGrupoDespesa modelView)
        {
            if (ModelState.IsValid)
            {
                var usuario = User.Identity.Name;
                try
                {
                    if (modelView.Id > 0)
                    {
                        var model = SubGrupoDespesaBll.GetSubGrupoDespesa(modelView.Id, usuario);
                        TryUpdateModel(model);
                        SubGrupoDespesaBll.Edit(model);
                    }
                    else
                    {
                        var model = new SubGrupoDespesa();
                        TryUpdateModel(model);
                        SubGrupoDespesaBll.Add(model);
                    }

                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { gravou = true });
                    }

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
                return View(modelView);
            }
        }

        [HttpPost]
        public ActionResult CadastroSubGrupoConta(int idGrupo, string nomeSubGrupo)
        {
            if (!string.IsNullOrWhiteSpace(nomeSubGrupo) && idGrupo > 0)
            {
                var usuario = User.Identity.Name;
                try
                {
                    var model = new SubGrupoDespesa();                    
                    model.Nome = nomeSubGrupo;
                    model.GrupoDespesaId = idGrupo;

                    SubGrupoDespesaBll.Add(model);

                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { gravou = true, idSubGrupo = model.Id });
                    }

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    return Json(new { gravou = false, msgEx = ex.Message });
                }
            }
            else
            {
                return View();
            }
        }
        #endregion

        #region Excluir

        #endregion

        #region Auxiliares
        public List<string> ConstroiTabela(List<GrupoDespesaViewModel> model)
        {
            var tbody = new StringBuilder();
            var tfoot = new StringBuilder();

            if (model.Count() > 0)
            {
                foreach (GrupoDespesaViewModel m in model)
                {
                    tbody.Append("<tr>");
                    tbody.AppendFormat("<td class=\"nome-grupo\">{0}</td>", m.NomeGrupo);
                    tbody.AppendFormat("<td class=\"nome-subgrupo\">{0}</td>", m.NomeSubGrupo);
                    tbody.Append("<td class=\"opcoes\">");
                    tbody.AppendFormat("<a href=\"{0}/{1}?conta=false\" class=\"editar\">Editar Grupo</a> | ", Url.Action("CadastroGrupo", "GrupoDespesa"), m.IdGrupo);
					tbody.AppendFormat("<a href=\"{0}/{1}?conta=false\" class=\"editar\">Editar SubGrupo</a> | ", @Url.Action("CadastroSubGrupo", "GrupoDespesa"), m.IdSubGrupo);
                    tbody.AppendFormat("<a href=\"#\" class=\"excluir\" onclick=\"return false;\">Excluir Sub-Grupo</a>{0}", "");
                    tbody.Append("</tr>");
                }
            }
            else
            {
                tbody.Append("<tr><td colspan=\"3\">&nbsp;Não foram encontrados registros ou ainda não existem sub-grupos cadastrados.</td></tr>");
            }

            var lista = new List<string>();
            lista.Add(tbody.ToString());
            lista.Add(tfoot.ToString());

            return lista;
        }

        [HttpGet]
        public ActionResult CarregaComboGrupo()
        {
            var json = new JsonResult { Data = new SelectList(GrupoDespesaBll.PreencheComboGrupoDespesa(User.Identity.Name), "Id", "Nome") };
            return Json(json, JsonRequestBehavior.AllowGet);
        }

        [HttpGet]
        public ActionResult CarregaComboSubGrupo(int id)
        {
            var json = new JsonResult { Data = new SelectList(SubGrupoDespesaBll.PreencheComboSubGrupoDespesa(User.Identity.Name, id), "Id", "Nome") };
            return Json(json, JsonRequestBehavior.AllowGet);
        }
        #endregion
    }
}
